LWG Welcome to ICTSC!
概要
ssh接続先で作業しているとき暇になった。
しかし、何のアプリを開いているか上司に監視されているため、コンソールしか遊ぶものがない。
ちょうどいいことに、接続先の環境がubuntu20.04であることに気がついた。
ソースコードを残すと遊んでいたことがバレてしまうため、一行のbashコマンドのみで動作を終わらせる必要がある。
試しに一行のbashコマンドのみを用いてコンソール上で次のように描画してみよう。
1.
色のブロックでICTSCと表記してみよう。
縦5ブロック、横26ブロック。
ANSIエスケープシーケンスで左から一文字ずつ順に赤、シアン、青、黄、緑色です。
2.
AAで大きく表示された”Welcome to ICTSC!”という文字列を画像のように動作させてみよう。
文字の切り替わる速さは0.2秒ぐらいが見やすい。
前提条件
bashのコマンドのみを用いること
一行のコマンドを解答に記載すること
問題1については縦5ブロック横26ブロックで表示すること
初期状態
figletコマンドがインストール済み
問題環境
Ubuntu20.04に対して、figletコマンドがインストール済み
終了状態
指定された画像と同じ結果が描画される
解説
概要
1.
ANSIエスケープシーケンスでそれぞれの背景色を力技でプロットしていきます。
テクニックとして、色のブロックはx1b[4&m
とx1b[m
の間の数字が変わっているだけなので、各色に対応する数字だけをプロットし、その前後にx1b[4&m
とx1b[m
を追加することにより、短くすることが出来ます。
これ以上短くしようとすると行列や図形的なアプローチが必要になりそう…
2.
“Welcome to ICTSC”という文字列の先頭の文字を最後尾に持ってくるのをループさせて、それをfigletで大文字表示することでことで描画できます。
シェル変数を定義して文字列の変更を制御した場合は、trap
コマンドを用いて動作終了時に設定したシェル変数を削除するとなおよし
解答例
1.
echo -e "111 6666 44444 333 2222n 1 6 4 3 2n 1 6 4 33 2n 1 6 4 3 2 n111 6666 4 333 2222" | sed 's/ / /g' | sed 's/[^ ]/x1b[4&m x1b[m/g'
2.
trap "unset string" SIGINT ; string="Welcome to ICTSC ! "; while true; do echo -ne "33[2J33[;H" "$(figlet -w 300 ${string})"; string="${string:1}${string:0:1}"; sleep 0.25; done
余談だが、コードブロックを使っていないため、ソースコードが提出時に自動で文字列として整形されてしまい、コードが崩れ、0と採点されているチームが多く見受けられ、次回からはソースコードの貼り付けにはコードブロック必須にするべきかと考えている。
採点基準
- なんらかの形で大きくICTSCと出力できていれば+10%、色がついていれば+20%
- 縦5ブロック、横26ブロックに反していると -6%
- figlet、もしくは力技でWelcome to ICTSCと出力されていれば+20%、文字列を右から左に流れる動作ができていれば+50%